
#include "common2.h"



/************************************************************************/
/*******************       客户端创建函数       *************************/
/************************************************************************/



int main(int argc, const char *argv[])
{
	int sfd,clientfd;
	struct sockaddr_in serveraddr;
	socklen_t len = sizeof(serveraddr);
	char clean[M]={0};/*****/
	MSG msg;
	int cmd;
	
	if(argc!=3)
	{
		printf("User:%s <IP> <port>\n",argv[0]);
		return -1;
	}
	if((sfd=socket(AF_INET,SOCK_STREAM,0))<0)//创建socket，获得socket文件描述符
	{
		perror("socket");
		return -1;
	}
	serveraddr.sin_family=AF_INET;
	serveraddr.sin_port=htons(atoi(argv[2]));
	serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
	
	if(connect(sfd,(struct sockaddr*)&serveraddr,len)<0)// 客户端链接服务器
	{
		perror("connect");
		return;
	}
	
	
ONE:	
	while(1)//一级的界面
	{
		puts("******************************************************");
		puts("1.管理员登录           2.普通用户登录           3.退出");
		puts("******************************************************");
		puts("input cmd>>>");
		if(scanf("%d",&cmd)!=1)// 检测输入的格式对否
		{
			puts("input error");
			fgets(clean,M,stdin);
			continue;
		}
		switch(cmd)//根据不同的输入命令执行不同的行为
		 {
			case 1:
				if(adm_login(sfd,&msg)==1)
				{
					goto ADMNEXT;
				}
				else
				{
					break;
				}
			case 2:
				if(user_login(sfd,&msg)==1)
				{
					goto USERNEXT;
				}
				else
				{
					break;
				}
			case 3:
				goto EXIT;
			default:
				puts("input error");
				break;

		 }
	}
	
EXIT: //退出 
	
	msg.type=E;
	send(sfd,&msg,LEN_SMG,0);
	close(sfd);  //客户端退出的处理   
	exit(0);	
ADMNEXT:

	while(1)//管理员二级界面
	{
		puts("***************************************************************************");
		puts("1.增加用户      2.删除用户       3.修改用户        4.查询用户        5.退出");
		puts("***************************************************************************");
		puts("input cmd>>>");
		if(scanf("%d",&cmd)!=1)// 检测输入的格式对否
		{
			puts("input error");
			fgets(clean,M,stdin);
			continue;
		}
		switch(cmd)//根据不同的输入命令执行不同的行为
		 {
			case 1:
				add_user(sfd,&msg);
				break;
			case 2:
				del_user(sfd,&msg);
				break;
			case 3:
				amend_user(sfd,&msg);
				break;
			case 4:
				adm_find(sfd,&msg);
				break;
			case 5:
				goto EXIT;
			default:
				puts("input error");
				break;

		 }
	}	
USERNEXT:
	while(1)//普通用户二级页面
	{
		puts("****************************************************");
		puts("1.修改密码            2.用户查询              3.退出");
		puts("****************************************************");
		puts("input cmd>>>");
			
		if(scanf("%d",&cmd)!=1)// 检测输入的格式对否
			{
				puts("input error");
				fgets(clean,M,stdin);
				continue;
			}
		switch(cmd)//根据不同的输入命令执行不同的行为
		{
			case 1:
				amend_pwd(sfd,&msg);
				break;
			case 2:
				user_find(sfd,&msg);
				break;
			case 3:
				goto EXIT;
			default:
				puts("input error");
				break;

		}
	}
	return 0;
	
}


/*****************客户端登录函数********************/

/************************************************************************/
/*******************       管理员登录函数       *************************/
/************************************************************************/
int adm_login(int sfd,MSG *msg)
{
	msg->type = A;
	puts("input name>>>");
	scanf("%s",msg->name);
	puts("input pwd>>>");
	scanf("%s",msg->pwd);
	send(sfd,msg,LEN_SMG,0);//用户名密码发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("Login ok!");
		 return 1;
	}
	else
	{
		puts("Login fail!");
		return -1;
	}
}

/************************************************************************/
/*******************      普通用户登录函数      *************************/
/************************************************************************/
int user_login(int sfd,MSG *msg)
{
	msg->type = B;
	puts("input name>>>");
	scanf("%s",msg->name);
	puts("input id>>>");
	scanf("%d",&(msg->id));
	puts("input pwd>>>");
	scanf("%s",msg->pwd);
	send(sfd,msg,LEN_SMG,0);//用户名密码发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("Login ok!");
		 return 1;
	}
	else
	{
		puts("Login fail!");
		return -1;
	}
}


/*****************客户端用户二级页面函数********************/


/************************************************************************/
/*******************    普通用户修改密码函数    *************************/
/************************************************************************/

 void amend_pwd(int sfd,MSG *msg)
 {	
	msg->type = C;
	puts("input pwd>>>");
	scanf("%s",msg->pwd);
	send(sfd,msg,LEN_SMG,0);//用户名密码发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("update ok!");
		 return ;
	}
	else
	{
		puts("update fail!");
		return ;
	}
 }
 
/************************************************************************/
/*******************      普通用户查询函数      *************************/
/************************************************************************/

void user_find(int sfd,MSG *msg)
{
	msg->type = D;
	send(sfd,msg,LEN_SMG,0);//用户名密码发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("find ok!");
		 printf("姓名:%s",msg->name);
		 printf("性别:%s",msg->sex);
		 printf("年龄:%s",msg->age);
		 printf("工资:%s\n",msg->salary);
		 return ;
	}
	else
	{
		puts("find fail!");
		return ;
	}
}


/*****************客户端管理员二级页面函数********************/


/************************************************************************/
/*******************        添加用户函数        *************************/
/************************************************************************/


void add_user(int sfd,MSG *msg)  
{
	msg->type = F;
	puts("input name>>>");
	scanf("%s",msg->name);
	puts("input pwd>>>");
	scanf("%s",msg->pwd);
	puts("input sex>>>");
	scanf("%s",msg->sex);
	puts("input age>>>");
	scanf("%s",msg->age);
	puts("input salary>>>");
	scanf("%s",msg->salary);
	send(sfd,msg,LEN_SMG,0);//用户名密码发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("add ok!");
		 
		 return ;
	}
	else if(strncmp(msg->pwd,"Fail",2)==0) 
	{
		puts("add fail!");
		return ;
	}
	else
	{
		puts("add fail ! The user is registered !");
		return ;
	}
}

/************************************************************************/
/*******************        删除用户函数        *************************/
/************************************************************************/


void del_user(int sfd,MSG *msg) 
{
	msg->type = G;
	puts("input name>>>");
	scanf("%s",msg->name);
	puts("input id>>>");
	scanf("%d",&(msg->id));
	send(sfd,msg,LEN_SMG,0);//用户名密码发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("update ok!");
		 return ;
	}
	else
	{
		puts("update fail!");
		return ;
	}
}

/************************************************************************/
/*******************        修改用户函数        *************************/
/************************************************************************/


void amend_user(int sfd,MSG *msg) //修改用户函数
{
	msg->type = H;
	puts("input name>>>");
	scanf("%s",msg->name);
	puts("input id>>>");
	scanf("%d",&(msg->id));
	puts("input sex>>>");
	scanf("%s",msg->sex);
	puts("input age>>>");
	scanf("%s",msg->age);
	puts("input salary>>>");
	scanf("%s",msg->salary);
	send(sfd,msg,LEN_SMG,0);//用户名密码发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("amend ok!");
		 return ;
	}
	else if(strncmp(msg->pwd,"Fail",2)==0) 
	{
		puts("amend fail!");
		return ;
	}
	else
	{
		puts("amend fail  ! No such user !");
		return ;
	}
}

/************************************************************************/
/*******************      管理员查询函数        *************************/
/************************************************************************/
void adm_find(int sfd,MSG *msg)
{
	msg->type = I;
	puts("input name>>>");
	scanf("%s",msg->name);
	puts("input id>>>");
	scanf("%d",&(msg->id));
	send(sfd,msg,LEN_SMG,0);//用户名发给服务器
	recv(sfd,msg,LEN_SMG,0); //等待服务器回应
	if(strncmp(msg->pwd,"OK",2)==0)
	{
		 puts("find ok!");
		 printf("姓名:%s\0",msg->name);
		 printf("性别:%s\0",msg->sex);
		 printf("年龄:%s\0",msg->age);
		 printf("工资:%s\0",msg->salary);
		 puts("");
		 return ;
	}
	else
	{
		puts("find fail!");
		return ;
	}
}



